/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package util;

import com.google.gson.JsonArray;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import java.lang.reflect.Type;
import pojos.Descargas;
import pojos.Movimientos;
import pojos.Pedido;
import pojos.Pojo;
import pojos.Producto;
import pojos.ProductoCategoria;
import pojos.Usuario;

/**
 *
 * @author Miguel
 */
public class PeticionDeserializer implements JsonDeserializer<Peticion> {

    @Override
    public Peticion deserialize(JsonElement json, Type typeOfT,
            JsonDeserializationContext context) throws JsonParseException {

        Peticion p;        
        JsonObject jsobj = json.getAsJsonObject();
        int tipo_peticion = jsobj.get("tipo").getAsInt();
        if (tipo_peticion == Peticion.TIPO_SELECT) {
            Query q = context.deserialize(jsobj.get("consulta"), Query.class);
            p = new Peticion(tipo_peticion, q);
        } else {
            p = obtenerPeticion(jsobj, context);
        }
        if(p==null) {
            throw new JsonParseException("No se pudo resolver la peticion");
        }
        return p;
    }

    private Peticion obtenerPeticion(JsonObject jsobj, JsonDeserializationContext context) {
        JsonArray jsarr = jsobj.get("pojos").getAsJsonArray();
        int tipo_pojos = jsobj.get("tipo_pojos").getAsInt();
        Pojo[] pojos = null;
        switch (tipo_pojos) {
            case Query.USUARIO_ARRAY:
                pojos = context.deserialize(jsarr, Usuario[].class);
                break;
            case Query.PRODUCTO_ARRAY:
                pojos = context.deserialize(jsarr, Producto[].class);
                break;
            case Query.DESCARGA_ARRAY:
                pojos = context.deserialize(jsarr, Descargas[].class);
                break;
            case Query.MOVIMIENTO_ARRAY:
                pojos = context.deserialize(jsarr, Movimientos[].class);
                break;
            case Query.PEDIDO_ARRAY:
                pojos = context.deserialize(jsarr, Pedido[].class);
                break;
            case Query.PRODUCTOCATEGORIA_ARRAY:
                pojos = context.deserialize(jsarr, ProductoCategoria[].class);
                break;
        }
        return new Peticion(jsobj.get("tipo").getAsInt(), tipo_pojos, pojos);
    }
}
